home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Games / MAME / src / drivers / kangaroo.c < prev    next >
C/C++ Source or Header  |  2000-04-04  |  16KB  |  459 lines

  1. /***************************************************************************
  2.  
  3. Kangaroo (c) Atari Games / Sun Electronics Corp 1982
  4.  
  5. driver by Ville Laitinen
  6.  
  7. In test mode, to test sound press 1 and 2 player start simultaneously.
  8. Punch + 1 player start moves to the crosshatch pattern.
  9.  
  10. To enter test mode in Funky Fish, keep the service coin pressed while
  11. resetting
  12.  
  13. TODO:
  14. - There is a custom microcontroller on the original Kangaroo board which is
  15.   not emulated. This MIGHT cause some problems, but we don't know of any.
  16.  
  17. ***************************************************************************
  18.  
  19. Kangaroo memory map
  20.  
  21. CPU #0
  22.  
  23. 0000-0fff tvg75
  24. 1000-1fff tvg76
  25. 2000-2fff tvg77
  26. 3000-3fff tvg78
  27. 4000-4fff tvg79
  28. 5000-5fff tvg80
  29. 8000-bfff VIDEO RAM (four banks)
  30. c000-cfff tvg83/84 (banked)
  31. d000-dfff tvg85/86 (banked)
  32. e000-e3ff RAM
  33.  
  34.  
  35. memory mapped ports:
  36. read:
  37. e400      DSW 0
  38. ec00      IN 0
  39. ed00      IN 1
  40. ee00      IN 2
  41. efxx      (4 bits wide) security chip in. It seems to work like a clock.
  42.  
  43. write:
  44. e800-e801 low/high byte start address of data in picture ROM for DMA
  45. e802-e803 low/high byte start address in bitmap RAM (where picture is to be
  46.           written) during DMA
  47. e804-e805 picture size for DMA, and DMA start
  48. e806      vertical scroll of playfield
  49. e807      horizontal scroll of playfield
  50. e808      bank select latch
  51. e809      A & B bitmap control latch (A=playfield B=motion)
  52.           bit 5 FLIP A
  53.           bit 4 FLIP B
  54.           bit 3 EN A
  55.           bit 2 EN B
  56.           bit 1 PRI A
  57.           bit 0 PRI B
  58. e80a      color shading latch
  59. ec00      command to sound CPU
  60. ed00      coin counters
  61. efxx      (4 bits wide) security chip out
  62.  
  63. ---------------------------------------------------------------------------
  64. CPU #1 (sound)
  65.  
  66. 0000 0fff tvg81
  67. 4000 43ff RAM
  68. 6000      command from main CPU
  69.  
  70. I/O ports:
  71. 7000      AY-3-8910 write
  72. 8000      AY-3-8910 control
  73. ---------------------------------------------------------------------------
  74.  
  75. interrupts:
  76. (CPU#0) standard IM 1 interrupt mode (rst #38 every vblank)
  77. (CPU#1) same here
  78.  
  79. ***************************************************************************/
  80.  
  81. #include "driver.h"
  82. #include "cpu/z80/z80.h"
  83.  
  84.  
  85.  
  86. /* machine */
  87. READ_HANDLER( kangaroo_sec_chip_r );
  88. WRITE_HANDLER( kangaroo_sec_chip_w );
  89.  
  90. /* vidhrdw */
  91. extern unsigned char *kangaroo_video_control;
  92. extern unsigned char *kangaroo_bank_select;
  93. extern unsigned char *kangaroo_blitter;
  94. extern unsigned char *kangaroo_scroll;
  95. void kangaroo_vh_convert_color_prom(unsigned char *palette, unsigned short *colortable,const unsigned char *color_prom);
  96. int  kangaroo_vh_start(void);
  97. void kangaroo_vh_stop(void);
  98. void kangaroo_vh_screenrefresh(struct osd_bitmap *bitmap,int full_refresh);
  99. WRITE_HANDLER( kangaroo_blitter_w );
  100. WRITE_HANDLER( kangaroo_videoram_w );
  101. WRITE_HANDLER( kangaroo_video_control_w );
  102. WRITE_HANDLER( kangaroo_bank_select_w );
  103. WRITE_HANDLER( kangaroo_color_mask_w );
  104.  
  105.  
  106.  
  107. static void kangaroo_init_machine(void)
  108. {
  109.     /* I think there is a bug in the startup checks of the game. At the very */
  110.     /* beginning, during the RAM check, it goes one byte too far, and ends up */
  111.     /* trying to write, and re-read, location dfff. To the best of my knowledge, */
  112.     /* that is a ROM address, so the test fails and the code keeps jumping back */
  113.     /* at 0000. */
  114.     /* However, a NMI causes a successful reset. Maybe the hardware generates a */
  115.     /* NMI short after power on, therefore masking the bug? The NMI is generated */
  116.     /* by the MB8841 custom microcontroller, so this could be a way to disguise */
  117.     /* the copy protection. */
  118.     /* Anyway, what I do here is just immediately generate the NMI, so the game */
  119.     /* properly starts. */
  120.     cpu_cause_interrupt(0,Z80_NMI_INT);
  121. }
  122.  
  123.  
  124. static WRITE_HANDLER( kangaroo_coin_counter_w )
  125. {
  126.     coin_counter_w(0, data & 1);
  127.     coin_counter_w(1, data & 2);
  128. }
  129.  
  130.  
  131. static struct MemoryReadAddress readmem[] =
  132. {
  133.     { 0x0000, 0x5fff, MRA_ROM },
  134.     { 0xc000, 0xdfff, MRA_BANK1 },
  135.     { 0xe000, 0xe3ff, MRA_RAM },
  136.     { 0xe400, 0xe400, input_port_3_r },
  137.     { 0xec00, 0xec00, input_port_0_r },
  138.     { 0xed00, 0xed00, input_port_1_r },
  139.     { 0xee00, 0xee00, input_port_2_r },
  140.     { 0xef00, 0xef00, kangaroo_sec_chip_r },
  141.     { -1 }  /* end of table */
  142. };
  143.  
  144. static struct MemoryWriteAddress writemem[] =
  145. {
  146.     { 0x0000, 0x5fff, MWA_ROM },
  147.     { 0x8000, 0xbfff, kangaroo_videoram_w },
  148.     { 0xc000, 0xdfff, MWA_ROM },
  149.     { 0xe000, 0xe3ff, MWA_RAM },
  150.     { 0xe800, 0xe805, kangaroo_blitter_w, &kangaroo_blitter },
  151.     { 0xe806, 0xe807, MWA_RAM, &kangaroo_scroll },
  152.     { 0xe808, 0xe808, kangaroo_bank_select_w, &kangaroo_bank_select },
  153.     { 0xe809, 0xe809, kangaroo_video_control_w, &kangaroo_video_control },
  154.     { 0xe80a, 0xe80a, kangaroo_color_mask_w },
  155.     { 0xec00, 0xec00, soundlatch_w },
  156.     { 0xed00, 0xed00, kangaroo_coin_counter_w },
  157.     { 0xef00, 0xefff, kangaroo_sec_chip_w },
  158.     { -1 }  /* end of table */
  159. };
  160.  
  161. static struct MemoryReadAddress sound_readmem[] =
  162. {
  163.     { 0x0000, 0x0fff, MRA_ROM },
  164.     { 0x4000, 0x43ff, MRA_RAM },
  165.     { 0x6000, 0x6000, soundlatch_r },
  166.     { -1 }  /* end of table */
  167. };
  168.  
  169. static struct MemoryWriteAddress sound_writemem[] =
  170. {
  171.     { 0x0000, 0x0fff, MWA_ROM },
  172.     { 0x4000, 0x43ff, MWA_RAM },
  173.     { -1 }  /* end of table */
  174. };
  175.  
  176. static struct IOWritePort sound_writeport[] =
  177. {
  178.     { 0x7000, 0x7000, AY8910_write_port_0_w },
  179.     { 0x8000, 0x8000, AY8910_control_port_0_w },
  180.     { -1 }  /* end of table */
  181. };
  182.  
  183.  
  184.  
  185. INPUT_PORTS_START( fnkyfish )
  186.     PORT_START      /* IN0 */
  187.     PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 )
  188.     PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START1 )
  189.     PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START2 )
  190.     PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_COIN1 )
  191.     PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNKNOWN )
  192.     PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNKNOWN )
  193.     PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNKNOWN )
  194.     PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN )
  195.  
  196.     PORT_START      /* IN1 */
  197.     PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT | IPF_8WAY )
  198.     PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT  | IPF_8WAY )
  199.     PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP    | IPF_8WAY )
  200.     PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN  | IPF_8WAY )
  201.     PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 )
  202.     PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNKNOWN )
  203.     PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNKNOWN )
  204.     PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN )
  205.  
  206.     PORT_START      /* IN2 */
  207.     PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT | IPF_8WAY | IPF_COCKTAIL )
  208.     PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT  | IPF_8WAY | IPF_COCKTAIL )
  209.     PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP    | IPF_8WAY | IPF_COCKTAIL )
  210.     PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN  | IPF_8WAY | IPF_COCKTAIL )
  211.     PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 | IPF_COCKTAIL )
  212.     PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNKNOWN )
  213.     PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNKNOWN )
  214.     PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN )
  215.  
  216.     PORT_START      /* DSW0 */
  217.     PORT_DIPNAME( 0x01, 0x00, DEF_STR( Lives ) )
  218.     PORT_DIPSETTING(    0x00, "3" )
  219.     PORT_DIPSETTING(    0x01, "5" )
  220.     PORT_DIPNAME( 0x02, 0x02, DEF_STR( Cabinet ) )
  221.     PORT_DIPSETTING(    0x02, DEF_STR( Upright ) )
  222.     PORT_DIPSETTING(    0x00, DEF_STR( Cocktail ) )
  223.     PORT_DIPNAME( 0x04, 0x00, DEF_STR( Flip_Screen ) )
  224.     PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
  225.     PORT_DIPSETTING(    0x04, DEF_STR( On ) )
  226.     PORT_DIPNAME( 0x08, 0x00, DEF_STR( Unknown ) )
  227.     PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
  228.     PORT_DIPSETTING(    0x08, DEF_STR( On ) )
  229.     PORT_DIPNAME( 0x10, 0x00, DEF_STR( Unknown ) )
  230.     PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
  231.     PORT_DIPSETTING(    0x10, DEF_STR( On ) )
  232.     PORT_DIPNAME( 0x20, 0x00, DEF_STR( Unknown ) )
  233.     PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
  234.     PORT_DIPSETTING(    0x20, DEF_STR( On ) )
  235.     PORT_DIPNAME( 0x40, 0x00, DEF_STR( Unknown ) )
  236.     PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
  237.     PORT_DIPSETTING(    0x40, DEF_STR( On ) )
  238.     PORT_DIPNAME( 0x80, 0x00, DEF_STR( Unknown ) )
  239.     PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
  240.     PORT_DIPSETTING(    0x80, DEF_STR( On ) )
  241. INPUT_PORTS_END
  242.  
  243. INPUT_PORTS_START( kangaroo )
  244.     PORT_START      /* IN0 */
  245.     PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 )
  246.     PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START1 )
  247.     PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START2 )
  248.     PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_COIN1 )
  249.     PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_COIN2 )
  250.     PORT_DIPNAME( 0x20, 0x00, "Music" )
  251.     PORT_DIPSETTING(    0x20, DEF_STR( Off ) )
  252.     PORT_DIPSETTING(    0x00, DEF_STR( On ) )
  253.     PORT_DIPNAME( 0x40, 0x00, DEF_STR( Cabinet ) )
  254.     PORT_DIPSETTING(    0x00, DEF_STR( Upright ) )
  255.     PORT_DIPSETTING(    0x40, DEF_STR( Cocktail ) )
  256.     PORT_DIPNAME( 0x80, 0x00, DEF_STR( Flip_Screen ) )
  257.     PORT_DIPSETTING(    0x80, DEF_STR( Off ) )
  258.     PORT_DIPSETTING(    0x00, DEF_STR( On ) )
  259.  
  260.     PORT_START      /* IN1 */
  261.     PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT | IPF_8WAY )
  262.     PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT  | IPF_8WAY )
  263.     PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP    | IPF_8WAY )
  264.     PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN  | IPF_8WAY )
  265.     PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 )
  266.     PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNKNOWN )
  267.     PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNKNOWN )
  268.     PORT_SERVICE( 0x80, IP_ACTIVE_HIGH )
  269.  
  270.     PORT_START      /* IN2 */
  271.     PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT | IPF_8WAY | IPF_COCKTAIL )
  272.     PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT  | IPF_8WAY | IPF_COCKTAIL )
  273.     PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP    | IPF_8WAY | IPF_COCKTAIL )
  274.     PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN  | IPF_8WAY | IPF_COCKTAIL )
  275.     PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 | IPF_COCKTAIL )
  276.     PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNKNOWN )
  277.     PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNKNOWN )
  278.     PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN )
  279.  
  280.     PORT_START      /* DSW0 */
  281.     PORT_DIPNAME( 0x01, 0x00, DEF_STR( Lives ) )
  282.     PORT_DIPSETTING(    0x00, "3" )
  283.     PORT_DIPSETTING(    0x01, "5" )
  284.     PORT_DIPNAME( 0x02, 0x00, DEF_STR( Difficulty ) )
  285.     PORT_DIPSETTING(    0x00, "Easy" )
  286.     PORT_DIPSETTING(    0x02, "Hard" )
  287.     PORT_DIPNAME( 0x0c, 0x00, DEF_STR( Bonus_Life ) )
  288.     PORT_DIPSETTING(    0x08, "10000 30000" )
  289.     PORT_DIPSETTING(    0x0c, "20000 40000" )
  290.     PORT_DIPSETTING(    0x04, "10000" )
  291.     PORT_DIPSETTING(    0x00, "None" )
  292.     PORT_DIPNAME( 0xf0, 0x00, DEF_STR( Coinage ) )
  293.     PORT_DIPSETTING(    0x10, DEF_STR( 2C_1C ) )
  294.     PORT_DIPSETTING(    0x20, "A 2C/1C B 1C/3C" )
  295.     PORT_DIPSETTING(    0x00, DEF_STR( 1C_1C ) )
  296.     PORT_DIPSETTING(    0x30, "A 1C/1C B 1C/2C" )
  297.     PORT_DIPSETTING(    0x40, "A 1C/1C B 1C/3C" )
  298.     PORT_DIPSETTING(    0x50, "A 1C/1C B 1C/4C" )
  299.     PORT_DIPSETTING(    0x60, "A 1C/1C B 1C/5C" )
  300.     PORT_DIPSETTING(    0x70, "A 1C/1C B 1C/6C" )
  301.     PORT_DIPSETTING(    0x80, DEF_STR( 1C_2C ) )
  302.     PORT_DIPSETTING(    0x90, "A 1C/2C B 1C/4C" )
  303.     PORT_DIPSETTING(    0xa0, "A 1C/2C B 1C/5C" )
  304.     PORT_DIPSETTING(    0xe0, "A 1C/2C B 1C/6C" )
  305.     PORT_DIPSETTING(    0xb0, "A 1C/2C B 1C/10C" )
  306.     PORT_DIPSETTING(    0xc0, "A 1C/2C B 1C/11C" )
  307.     PORT_DIPSETTING(    0xd0, "A 1C/2C B 1C/12C" )
  308.     /* 0xe0 gives A 1/2 B 1/6 */
  309.     PORT_DIPSETTING(    0xf0, DEF_STR( Free_Play ) )
  310. INPUT_PORTS_END
  311.  
  312.  
  313.  
  314. static struct AY8910interface ay8910_interface =
  315. {
  316.     1,  /* 1 chip */
  317.     10000000/8,     /* 1.25 MHz */
  318.     { 50 },
  319.     { 0 },
  320.     { 0 },
  321.     { 0 },
  322.     { 0 }
  323. };
  324.  
  325.  
  326.  
  327. static struct MachineDriver machine_driver_kangaroo =
  328. {
  329.     /* basic machine hardware */
  330.     {
  331.         {
  332.             CPU_Z80,
  333.             10000000/4, /* 2.5 Mhz */
  334.             readmem,writemem,0,0,
  335.             interrupt,1
  336.         },
  337.         {
  338.             CPU_Z80 | CPU_16BIT_PORT | CPU_AUDIO_CPU,
  339.             10000000/4, /* 2.5 MHz */
  340.             sound_readmem,sound_writemem,0,sound_writeport,
  341.             interrupt,1
  342.         }
  343.     },
  344.     60, DEFAULT_60HZ_VBLANK_DURATION,   /* frames per second, vblank duration */
  345.     1,  /* 1 CPU slice per frame - interleaving is forced when a sound command is written */
  346.     kangaroo_init_machine,
  347.  
  348.     /* video hardware */
  349.     32*8, 32*8, { 0, 255, 8, 255-8 },
  350.     0,
  351.     24,0,
  352.     kangaroo_vh_convert_color_prom,
  353.  
  354.     VIDEO_TYPE_RASTER | VIDEO_MODIFIES_PALETTE,
  355.     0,
  356.     kangaroo_vh_start,
  357.     kangaroo_vh_stop,
  358.     kangaroo_vh_screenrefresh,
  359.  
  360.     /* sound hardware */
  361.     0,0,0,0,
  362.     {
  363.         {
  364.             SOUND_AY8910,
  365.             &ay8910_interface
  366.         }
  367.     }
  368. };
  369.  
  370.  
  371. /***************************************************************************
  372.  
  373.   Game driver(s)
  374.  
  375. ***************************************************************************/
  376.  
  377. ROM_START( fnkyfish )
  378.     ROM_REGION( 0x14000, REGION_CPU1 ) /* 64k for code + 16k for banked ROMs */
  379.     ROM_LOAD( "tvg_64.0",    0x0000,  0x1000, 0xaf728803 )
  380.     ROM_LOAD( "tvg_65.1",    0x1000,  0x1000, 0x71959e6b )
  381.     ROM_LOAD( "tvg_66.2",    0x2000,  0x1000, 0x5ccf68d4 )
  382.     ROM_LOAD( "tvg_67.3",    0x3000,  0x1000, 0x938ff36f )
  383.  
  384.     ROM_LOAD( "tvg_69.v0",   0x10000, 0x1000, 0xcd532d0b ) /* graphics ROMs */
  385.     ROM_LOAD( "tvg_71.v2",   0x11000, 0x1000, 0xa59c9713 )
  386.     ROM_LOAD( "tvg_70.v1",   0x12000, 0x1000, 0xfd308ef1 )
  387.     ROM_LOAD( "tvg_72.v3",   0x13000, 0x1000, 0x6ae9b584 )
  388.  
  389.     ROM_REGION( 0x10000, REGION_CPU2 ) /* sound */
  390.     ROM_LOAD( "tvg_68.8",    0x0000,  0x1000, 0xd36bb2be )
  391. ROM_END
  392.  
  393. ROM_START( kangaroo )
  394.     ROM_REGION( 0x14000, REGION_CPU1 ) /* 64k for code + 16k for banked ROMs */
  395.     ROM_LOAD( "tvg_75.0",    0x0000,  0x1000, 0x0d18c581 )
  396.     ROM_LOAD( "tvg_76.1",    0x1000,  0x1000, 0x5978d37a )
  397.     ROM_LOAD( "tvg_77.2",    0x2000,  0x1000, 0x522d1097 )
  398.     ROM_LOAD( "tvg_78.3",    0x3000,  0x1000, 0x063da970 )
  399.     ROM_LOAD( "tvg_79.4",    0x4000,  0x1000, 0x9e5cf8ca )
  400.     ROM_LOAD( "tvg_80.5",    0x5000,  0x1000, 0x2fc18049 )
  401.  
  402.     ROM_LOAD( "tvg_83.v0",   0x10000, 0x1000, 0xc0446ca6 ) /* graphics ROMs */
  403.     ROM_LOAD( "tvg_85.v2",   0x11000, 0x1000, 0x72c52695 )
  404.     ROM_LOAD( "tvg_84.v1",   0x12000, 0x1000, 0xe4cb26c2 )
  405.     ROM_LOAD( "tvg_86.v3",   0x13000, 0x1000, 0x9e6a599f )
  406.  
  407.     ROM_REGION( 0x10000, REGION_CPU2 ) /* sound */
  408.     ROM_LOAD( "tvg_81.8",    0x0000,  0x1000, 0xfb449bfd )
  409.  
  410.     ROM_REGION( 0x0800, REGION_CPU3 )  /* 8k for the MB8841 custom microcontroller (currently not emulated) */
  411.     ROM_LOAD( "tvg_82.12",   0x0000,  0x0800, 0x57766f69 )
  412. ROM_END
  413.  
  414. ROM_START( kangaroa )
  415.     ROM_REGION( 0x14000, REGION_CPU1 ) /* 64k for code + 16k for banked ROMs */
  416.     ROM_LOAD( "tvg_75.0",    0x0000,  0x1000, 0x0d18c581 )
  417.     ROM_LOAD( "tvg_76.1",    0x1000,  0x1000, 0x5978d37a )
  418.     ROM_LOAD( "tvg_77.2",    0x2000,  0x1000, 0x522d1097 )
  419.     ROM_LOAD( "tvg_78.3",    0x3000,  0x1000, 0x063da970 )
  420.     ROM_LOAD( "tvg79.bin",   0x4000,  0x1000, 0x82a26c7d )
  421.     ROM_LOAD( "tvg80.bin",   0x5000,  0x1000, 0x3dead542 )
  422.  
  423.     ROM_LOAD( "tvg_83.v0",   0x10000, 0x1000, 0xc0446ca6 ) /* graphics ROMs */
  424.     ROM_LOAD( "tvg_85.v2",   0x11000, 0x1000, 0x72c52695 )
  425.     ROM_LOAD( "tvg_84.v1",   0x12000, 0x1000, 0xe4cb26c2 )
  426.     ROM_LOAD( "tvg_86.v3",   0x13000, 0x1000, 0x9e6a599f )
  427.  
  428.     ROM_REGION( 0x10000, REGION_CPU2 ) /* sound */
  429.     ROM_LOAD( "tvg_81.8",    0x0000,  0x1000, 0xfb449bfd )
  430.  
  431.     ROM_REGION( 0x0800, REGION_CPU3 )  /* 8k for the MB8841 custom microcontroller (currently not emulated) */
  432.     ROM_LOAD( "tvg_82.12",   0x0000,  0x0800, 0x57766f69 )
  433. ROM_END
  434.  
  435. ROM_START( kangarob )
  436.     ROM_REGION( 0x14000, REGION_CPU1 ) /* 64k for code + 16k for banked ROMs */
  437.     ROM_LOAD( "tvg_75.0",    0x0000,  0x1000, 0x0d18c581 )
  438.     ROM_LOAD( "tvg_76.1",    0x1000,  0x1000, 0x5978d37a )
  439.     ROM_LOAD( "tvg_77.2",    0x2000,  0x1000, 0x522d1097 )
  440.     ROM_LOAD( "tvg_78.3",    0x3000,  0x1000, 0x063da970 )
  441.     ROM_LOAD( "tvg_79.4",    0x4000,  0x1000, 0x9e5cf8ca )
  442.     ROM_LOAD( "k6",          0x5000,  0x1000, 0x7644504a )
  443.  
  444.     ROM_LOAD( "tvg_83.v0",   0x10000, 0x1000, 0xc0446ca6 ) /* graphics ROMs */
  445.     ROM_LOAD( "tvg_85.v2",   0x11000, 0x1000, 0x72c52695 )
  446.     ROM_LOAD( "tvg_84.v1",   0x12000, 0x1000, 0xe4cb26c2 )
  447.     ROM_LOAD( "tvg_86.v3",   0x13000, 0x1000, 0x9e6a599f )
  448.  
  449.     ROM_REGION( 0x10000, REGION_CPU2 ) /* sound */
  450.     ROM_LOAD( "tvg_81.8",    0x0000,  0x1000, 0xfb449bfd )
  451. ROM_END
  452.  
  453.  
  454.  
  455. GAME( 1981, fnkyfish, 0,        kangaroo, fnkyfish, 0, ROT90, "Sun Electronics", "Funky Fish" )
  456. GAME( 1982, kangaroo, 0,        kangaroo, kangaroo, 0, ROT90, "Sun Electronics", "Kangaroo" )
  457. GAME( 1982, kangaroa, kangaroo, kangaroo, kangaroo, 0, ROT90, "[Sun Electronics] (Atari license)", "Kangaroo (Atari)" )
  458. GAME( 1982, kangarob, kangaroo, kangaroo, kangaroo, 0, ROT90, "bootleg", "Kangaroo (bootleg)" )
  459.